package com.carlinfo.shop.common.util;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.stereotype.Component;

/**
 * poi相关的工具类
 * 
 * @author wangshMac
 */
@Component("poiUtil")
public class POIUtil
{
	/**
	 * 保存xls的方法
	 * @param file 文件的模板输入流;模板里面只有一行,就是title;主要是为了,区分列的顺序
	 * @param List List是行,里面的元素也是List;里面的Map;键是标题头,值是 真正的结果
	 */
	public void writeExcel(InputStream is,List dataList,OutputStream os)
	{
		/* 模板文件 */
		try
		{
			Workbook workbook = new HSSFWorkbook(new NPOIFSFileSystem(is));
			/* 只要第一个sheet  */
			Sheet sheet = workbook.getSheetAt(0);
			/* 读取标题的头部 */
			Row row = sheet.getRow(0);
			/* 存储所有的标题的头部
			 * {日期=0,最大价格=2,总数量=1}
			 *  */
			Map<String, Integer> titleMap = new HashMap<String, Integer>();
			/* 取到每一列 */
			int titleCount = 0 ; 
			for (Iterator iterator = row.cellIterator(); iterator.hasNext();)
			{
				Cell cellTemp = (Cell) iterator.next();
				titleMap.put(cellTemp.toString(), titleCount);
				titleCount ++ ; 
			}
			
			/* 存储数据
			 * 外循环是行
			 * 内循环是列
			 *  */
			int dataRow = 1 ; 
			for (Iterator iterator = dataList.iterator(); iterator.hasNext();)
			{
				/* 取到row;模板中只有一行;
				 * 第二行
				 *  */
				Row row2 = sheet.createRow(dataRow);
				Map<String, Object> dataMap = (Map<String, Object>) iterator.next();
				
				/* 循环标题头部 */
				for (Iterator iterator2 = titleMap.entrySet().iterator(); iterator2.hasNext();)
				{
					/* 键:是xls中的标题的头部,值是列的顺序 */
					Entry me = (Entry) iterator2.next();
					/* 创建的单元格是几列,取决于titleMap中的值 */
					String key = me.getKey() + "" ; 
					int value = Integer.valueOf( me.getValue() + "" ); 
					
					/* 创建的是第几个单元格 */
					Cell cell = row2.createCell(value);
					/* 赋值的时候从dataMap中取值 */
					cell.setCellValue(dataMap.get(key) + "");
				}
				
				dataRow ++ ; 
			}
			
			/* 在保存文件的时候需要一个outputStream */
			workbook.write(os);
			/* 保存文件 */
			workbook.close();
		} catch (IOException e)
		{
			ConstatFinalUtil.LOGGER.error("保存xls失败了;" ,e);
		}
	}
}
